﻿#ifndef SIGNALSPECTRUM_H
#define SIGNALSPECTRUM_H

#if defined(SIGNALSPECTRUM_LIBRARY)
#  define SIGNALSPECTRUM_EXPORT _declspec(dllexport)
#else
#  define SIGNALSPECTRUM_EXPORT _declspec(dllimport)
#endif

// 加入extern "C"以禁用C++名称修饰
#ifdef __cplusplus
extern "C" {
#endif

#define   R2FFT          0 //实转fft
#define   C2FFT          1 //复转fft

#define WIN_None            0   //不加窗（暂时默认一半）
#define WIN_Rectangle       1   //矩形窗
#define WIN_Bartlett        2   //三角形窗
#define WIN_Hanning         3   //汉宁窗
#define WIN_Hamming         4   //海明窗
#define WIN_Blackman        5   //布莱克曼窗
#define WIN_BlackmanHarris  6   //布莱克曼-哈里斯窗
#define WIN_BlackmanNuttall 7   //布莱克曼-纳托儿窗
#define WIN_Nuttall         8   //纳托儿窗
#define WIN_Gaussian        9   //高斯窗
#define WIN_FlatTop         10  //平顶窗
#define WIN_KaiserBasel     11  //凯赛-贝塞尔窗 (未实现)
#define WIN_Chebyshev       12  //切比雪夫窗 (未实现)

/**
 * @brief Spectrum_Open 功能：打开频谱类
 * @param pSpectrum 频谱类
 * @param outFftLen 输出fft长度
 * @param type      处理模式（默认实信号输入）
 */
SIGNALSPECTRUM_EXPORT void Spectrum_Open(void **pSpectrum,int outFftLen,int winType,int type = R2FFT);

/**
 * @brief Spectrum_ConversionMAX 功能：FFT变换/多帧最大值保持
 * @param pSpectrum 频谱类
 * @param inBuf     输入数组
 * @param iLen      输入长度
 * @param outBuf    输出数据
 * @param levelPoor 电平差 | 计算方法：先用0差，计算出来的fft电平值与信号源上电平值求差  | 内部计算为 fft+levelPoor
 * @param smooth    平滑（默认不平滑）
 * @param smoothNum 平滑次数 （默认8）
 */
SIGNALSPECTRUM_EXPORT void Spectrum_ConversionMAXsf(void* pSpectrum,short inBuf[],int iLen,float outBuf[],float levelPoor = 0,bool smooth = false,int smoothNum=8);

/**
 * @brief Spectrum_ConversionMEAN 功能：FFT变换/多帧平均
 * @param pSpectrum 频谱类
 * @param inBuf     输入数组
 * @param iLen      输入长度
 * @param outBuf    输出数据
 * @param levelPoor 电平差 | 计算方法：先用0差，计算出来的fft电平值与信号源上电平值求差  | 内部计算为 fft+levelPoor
 * @param smooth    平滑（默认不平滑）
 * @param smoothNum 平滑次数 （默认8）
 */
SIGNALSPECTRUM_EXPORT void Spectrum_ConversionMEANsf(void* pSpectrum,short inBuf[],int iLen,float outBuf[],float levelPoor = 0,bool smooth = false,int smoothNum=8);

/**
 * @brief Spectrum_ConversionMIN 功能：FFT变换/多帧最小保持
 * @param pSpectrum 频谱类
 * @param inBuf     输入数组
 * @param iLen      输入长度
 * @param outBuf    输出数据
 * @param levelPoor 电平差 | 计算方法：先用0差，计算出来的fft电平值与信号源上电平值求差  | 内部计算为 fft+levelPoor
 * @param smooth    平滑（默认不平滑）
 * @param smoothNum 平滑次数 （默认8）
 */
SIGNALSPECTRUM_EXPORT void Spectrum_ConversionMINsf(void* pSpectrum,short inBuf[],int iLen,float outBuf[],float levelPoor = 0,bool smooth = false,int smoothNum=8);

/**
 * @brief Spectrum_ConversionMAX 功能：FFT变换/多帧最大值保持
 * @param pSpectrum 频谱类
 * @param inBuf     输入数组
 * @param iLen      输入长度
 * @param outBuf    输出数据
 * @param levelPoor 电平差 | 计算方法：先用0差，计算出来的fft电平值与信号源上电平值求差  | 内部计算为 fft+levelPoor
 * @param smooth    平滑（默认不平滑）
 * @param smoothNum 平滑次数 （默认8）
 */
SIGNALSPECTRUM_EXPORT void Spectrum_ConversionMAXss(void* pSpectrum,short inBuf[],int iLen,short outBuf[],short levelPoor = 0,bool smooth = false,int smoothNum=8);

/**
 * @brief Spectrum_ConversionMEAN 功能：FFT变换/多帧平均
 * @param pSpectrum 频谱类
 * @param inBuf     输入数组
 * @param iLen      输入长度
 * @param outBuf    输出数据
 * @param levelPoor 电平差 | 计算方法：先用0差，计算出来的fft电平值与信号源上电平值求差  | 内部计算为 fft+levelPoor
 * @param smooth    平滑（默认不平滑）
 * @param smoothNum 平滑次数 （默认8）
 */
SIGNALSPECTRUM_EXPORT void Spectrum_ConversionMEANss(void* pSpectrum,short inBuf[],int iLen,short outBuf[],short levelPoor = 0,bool smooth = false,int smoothNum=8);

/**
 * @brief Spectrum_ConversionMIN 功能：FFT变换/多帧最小值保持
 * @param pSpectrum 频谱类
 * @param inBuf     输入数组
 * @param iLen      输入长度
 * @param outBuf    输出数据
 * @param levelPoor 电平差 | 计算方法：先用0差，计算出来的fft电平值与信号源上电平值求差  | 内部计算为 fft+levelPoor
 * @param smooth    平滑（默认不平滑）
 * @param smoothNum 平滑次数 （默认8）
 */
SIGNALSPECTRUM_EXPORT void Spectrum_ConversionMINss(void* pSpectrum,short inBuf[],int iLen,short outBuf[],short levelPoor = 0,bool smooth = false,int smoothNum=8);

/**
 * @brief Spectrum_ConversionMAX 功能：FFT变换/多帧最大值保持
 * @param pSpectrum 频谱类
 * @param inBuf     输入数组
 * @param iLen      输入长度
 * @param outBuf    输出数据
 * @param levelPoor 电平差 | 计算方法：先用0差，计算出来的fft电平值与信号源上电平值求差  | 内部计算为 fft+levelPoor
 * @param smooth    平滑（默认不平滑）
 * @param smoothNum 平滑次数 （默认8）
 */
SIGNALSPECTRUM_EXPORT void Spectrum_ConversionMAXfs(void* pSpectrum,float inBuf[],int iLen,short outBuf[],short levelPoor = 0,bool smooth = false,int smoothNum=8);

/**
 * @brief Spectrum_ConversionMAX 功能：FFT变换/多帧最大值保持 float->float
 * @param pSpectrum 频谱类
 * @param inBuf     输入数组
 * @param iLen      输入长度
 * @param outBuf    输出数据
 * @param levelPoor 电平差 | 计算方法：先用0差，计算出来的fft电平值与信号源上电平值求差  | 内部计算为 fft+levelPoor
 * @param smooth    平滑（默认不平滑）
 * @param smoothNum 平滑次数 （默认8）
 */
SIGNALSPECTRUM_EXPORT void Spectrum_ConversionMAXff(void* pSpectrum,float inBuf[],int iLen,float outBuf[],short levelPoor = 0,bool smooth = false,int smoothNum=8);

/**
 * @brief Spectrum_Close 功能：关闭频谱类
 * @param pSpectrum 频谱类
 */
SIGNALSPECTRUM_EXPORT void Spectrum_Close(void* pSpectrum);

#ifdef __cplusplus
}
#endif

#endif // SIGNALSPECTRUM_H
